/**
 * 文件工具类
 * 提供文件操作相关的工具方法
 */

/**
 * 创建空文件
 * @param fileName 文件名
 * @param mimeType MIME类型，默认为text/plain
 * @returns File对象
 */
export function createEmptyFile(fileName: string, mimeType: string = 'text/plain'): File {
  const blob = new Blob([''], { type: mimeType });
  return new File([blob], fileName, { type: mimeType });
}

/**
 * 创建指定内容的文件
 * @param fileName 文件名
 * @param content 文件内容
 * @param mimeType MIME类型，默认为text/plain
 * @returns File对象
 */
export function createFileWithContent(
  fileName: string, 
  content: string, 
  mimeType: string = 'text/plain'
): File {
  const blob = new Blob([content], { type: mimeType });
  return new File([blob], fileName, { type: mimeType });
}

/**
 * 创建指定二进制内容的文件
 * @param fileName 文件名
 * @param content 二进制文件内容（Blob、ArrayBuffer、Uint8Array等）
 * @param mimeType MIME类型，默认为application/octet-stream
 * @returns File对象
 */
export function createFileWithBinaryContent(
  fileName: string, 
  content: BlobPart, 
  mimeType: string = 'application/octet-stream'
): File {
  const blob = new Blob([content], { type: mimeType });
  return new File([blob], fileName, { type: mimeType });
}

/**
 * 根据文件扩展名创建对应的空文件
 * @param fileName 文件名（包含扩展名）
 * @returns File对象
 */
export function createEmptyFileByExtension(fileName: string): File {
  const extension = fileName.split('.').pop()?.toLowerCase();
  let mimeType = 'text/plain';
  
  // 根据扩展名设置MIME类型
  switch (extension) {
    // 文本文件
    case 'txt':
      mimeType = 'text/plain';
      break;
    case 'md':
      mimeType = 'text/markdown';
      break;
    case 'html':
    case 'htm':
      mimeType = 'text/html';
      break;
    case 'css':
      mimeType = 'text/css';
      break;
    case 'scss':
      mimeType = 'text/x-scss';
      break;
    case 'sass':
      mimeType = 'text/x-sass';
      break;
    case 'less':
      mimeType = 'text/x-less';
      break;
    
    // 编程语言文件
    case 'js':
      mimeType = 'application/javascript';
      break;
    case 'ts':
      mimeType = 'application/typescript';
      break;
    case 'd.ts':
      mimeType = 'application/typescript';
      break;
    case 'vue':
      mimeType = 'text/vue';
      break;
    case 'py':
      mimeType = 'text/x-python';
      break;
    case 'java':
      mimeType = 'text/x-java-source';
      break;
    case 'cpp':
      mimeType = 'text/x-c++src';
      break;
    case 'c':
      mimeType = 'text/x-csrc';
      break;
    case 'h':
      mimeType = 'text/x-chdr';
      break;
    case 'hpp':
      mimeType = 'text/x-c++hdr';
      break;
    case 'php':
      mimeType = 'application/x-httpd-php';
      break;
    case 'go':
      mimeType = 'text/x-go';
      break;
    case 'rs':
      mimeType = 'text/x-rust';
      break;
    case 'swift':
      mimeType = 'text/x-swift';
      break;
    case 'kt':
      mimeType = 'text/x-kotlin';
      break;
    case 'scala':
      mimeType = 'text/x-scala';
      break;
    case 'rb':
      mimeType = 'text/x-ruby';
      break;
    case 'pl':
      mimeType = 'text/x-perl';
      break;
    case 'sh':
      mimeType = 'application/x-sh';
      break;
    case 'bat':
      mimeType = 'application/x-msdos-program';
      break;
    case 'ps1':
      mimeType = 'application/x-powershell';
      break;
    
    // 数据文件
    case 'json':
      mimeType = 'application/json';
      break;
    case 'xml':
      mimeType = 'application/xml';
      break;
    case 'csv':
      mimeType = 'text/csv';
      break;
    case 'sql':
      mimeType = 'application/sql';
      break;
    case 'yaml':
    case 'yml':
      mimeType = 'application/x-yaml';
      break;
    case 'toml':
      mimeType = 'application/toml';
      break;
    case 'ini':
      mimeType = 'text/plain';
      break;
    case 'conf':
      mimeType = 'text/plain';
      break;
    
    // 文档文件
    case 'pdf':
      mimeType = 'application/pdf';
      break;
    case 'doc':
      mimeType = 'application/msword';
      break;
    case 'docx':
      mimeType = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';
      break;
    case 'xls':
      mimeType = 'application/vnd.ms-excel';
      break;
    case 'xlsx':
      mimeType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
      break;
    case 'ppt':
      mimeType = 'application/vnd.ms-powerpoint';
      break;
    case 'pptx':
      mimeType = 'application/vnd.openxmlformats-officedocument.presentationml.presentation';
      break;
    case 'rtf':
      mimeType = 'application/rtf';
      break;
    
    // 日志和配置文件
    case 'log':
      mimeType = 'text/plain';
      break;
    case 'env':
      mimeType = 'text/plain';
      break;
    case 'gitignore':
      mimeType = 'text/plain';
      break;
    case 'dockerfile':
      mimeType = 'text/plain';
      break;
    
    // 包管理文件
    case 'package.json':
      mimeType = 'application/json';
      break;
    case 'package-lock.json':
      mimeType = 'application/json';
      break;
    case 'yarn.lock':
      mimeType = 'text/plain';
      break;
    case 'pnpm-lock.yaml':
      mimeType = 'application/x-yaml';
      break;

    default:
      mimeType = 'text/plain';
  }
  
  return createEmptyFile(fileName, mimeType);
}

/**
 * 创建常见的空文件类型
 */
export const createEmptyFiles = {
  /**
   * 创建空文本文件
   */
  text: (fileName: string = '新建文件.txt') => createEmptyFile(fileName, 'text/plain'),
  
  /**
   * 创建空Markdown文件
   */
  markdown: (fileName: string = '新建文件.md') => createEmptyFile(fileName, 'text/markdown'),
  
  /**
   * 创建空HTML文件
   */
  html: (fileName: string = '新建文件.html') => createEmptyFile(fileName, 'text/html'),
  
  /**
   * 创建空CSS文件
   */
  css: (fileName: string = '新建文件.css') => createEmptyFile(fileName, 'text/css'),
  
  /**
   * 创建空JavaScript文件
   */
  javascript: (fileName: string = '新建文件.js') => createEmptyFile(fileName, 'application/javascript'),
  
  /**
   * 创建空TypeScript文件
   */
  typescript: (fileName: string = '新建文件.ts') => createEmptyFile(fileName, 'application/typescript'),
  
  /**
   * 创建空Vue文件
   */
  vue: (fileName: string = '新建文件.vue') => createEmptyFile(fileName, 'text/vue'),
  
  /**
   * 创建空JSON文件
   */
  json: (fileName: string = '新建文件.json') => createEmptyFile(fileName, 'application/json'),
  
  /**
   * 创建空XML文件
   */
  xml: (fileName: string = '新建文件.xml') => createEmptyFile(fileName, 'application/xml'),
  
  /**
   * 创建空日志文件
   */
  log: (fileName: string = '新建文件.log') => createEmptyFile(fileName, 'text/plain'),
  
  /**
   * 创建空CSV文件
   */
  csv: (fileName: string = '新建文件.csv') => createEmptyFile(fileName, 'text/csv'),
  
  /**
   * 创建空Word文档
   */
  word: (fileName: string = '新建文档.docx') => createEmptyFile(fileName, 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'),
  
  /**
   * 创建空Excel表格
   */
  excel: (fileName: string = '新建表格.xlsx') => createEmptyFile(fileName, 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'),
  
  /**
   * 创建空PowerPoint演示
   */
  powerpoint: (fileName: string = '新建演示.pptx') => createEmptyFile(fileName, 'application/vnd.openxmlformats-officedocument.presentationml.presentation'),
  
  /**
   * 创建空PDF文档
   */
  pdf: (fileName: string = '新建文档.pdf') => createEmptyFile(fileName, 'application/pdf'),
  
  /**
   * 创建空RTF文档
   */
  rtf: (fileName: string = '新建文档.rtf') => createEmptyFile(fileName, 'application/rtf'),
  
  /**
   * 创建空SQL文件
   */
  sql: (fileName: string = '新建文件.sql') => createEmptyFile(fileName, 'application/sql'),
  
  /**
   * 创建空Python文件
   */
  python: (fileName: string = '新建文件.py') => createEmptyFile(fileName, 'text/x-python'),
  
  /**
   * 创建空Java文件
   */
  java: (fileName: string = '新建文件.java') => createEmptyFile(fileName, 'text/x-java-source'),
  
  /**
   * 创建空C++文件
   */
  cpp: (fileName: string = '新建文件.cpp') => createEmptyFile(fileName, 'text/x-c++src'),
  
  /**
   * 创建空C文件
   */
  c: (fileName: string = '新建文件.c') => createEmptyFile(fileName, 'text/x-csrc'),
  
  /**
   * 创建空PHP文件
   */
  php: (fileName: string = '新建文件.php') => createEmptyFile(fileName, 'application/x-httpd-php'),
  
  /**
   * 创建空Go文件
   */
  go: (fileName: string = '新建文件.go') => createEmptyFile(fileName, 'text/x-go'),
  
  /**
   * 创建空Rust文件
   */
  rust: (fileName: string = '新建文件.rs') => createEmptyFile(fileName, 'text/x-rust'),
  
  /**
   * 创建空Swift文件
   */
  swift: (fileName: string = '新建文件.swift') => createEmptyFile(fileName, 'text/x-swift'),
  
  /**
   * 创建空Kotlin文件
   */
  kotlin: (fileName: string = '新建文件.kt') => createEmptyFile(fileName, 'text/x-kotlin'),
  
  /**
   * 创建空Scala文件
   */
  scala: (fileName: string = '新建文件.scala') => createEmptyFile(fileName, 'text/x-scala'),
  
  /**
   * 创建空Ruby文件
   */
  ruby: (fileName: string = '新建文件.rb') => createEmptyFile(fileName, 'text/x-ruby'),
  
  /**
   * 创建空Perl文件
   */
  perl: (fileName: string = '新建文件.pl') => createEmptyFile(fileName, 'text/x-perl'),
  
  /**
   * 创建空Shell脚本
   */
  shell: (fileName: string = '新建文件.sh') => createEmptyFile(fileName, 'application/x-sh'),
  
  /**
   * 创建空Batch文件
   */
  batch: (fileName: string = '新建文件.bat') => createEmptyFile(fileName, 'application/x-msdos-program'),
  
  /**
   * 创建空PowerShell脚本
   */
  powershell: (fileName: string = '新建文件.ps1') => createEmptyFile(fileName, 'application/x-powershell'),
  
  /**
   * 创建空YAML文件
   */
  yaml: (fileName: string = '新建文件.yaml') => createEmptyFile(fileName, 'application/x-yaml'),
  
  /**
   * 创建空TOML文件
   */
  toml: (fileName: string = '新建文件.toml') => createEmptyFile(fileName, 'application/toml'),
  
  /**
   * 创建空INI文件
   */
  ini: (fileName: string = '新建文件.ini') => createEmptyFile(fileName, 'text/plain'),
  
  /**
   * 创建空配置文件
   */
  config: (fileName: string = '新建文件.conf') => createEmptyFile(fileName, 'text/plain'),
  
  /**
   * 创建空Dockerfile
   */
  dockerfile: (fileName: string = 'Dockerfile') => createEmptyFile(fileName, 'text/plain'),
  
  /**
   * 创建空Git忽略文件
   */
  gitignore: (fileName: string = '.gitignore') => createEmptyFile(fileName, 'text/plain'),
  
  /**
   * 创建空README文件
   */
  readme: (fileName: string = 'README.md') => createEmptyFile(fileName, 'text/markdown'),
  
  /**
   * 创建空LICENSE文件
   */
  license: (fileName: string = 'LICENSE') => createEmptyFile(fileName, 'text/plain'),
  
  /**
   * 创建空CHANGELOG文件
   */
  changelog: (fileName: string = 'CHANGELOG.md') => createEmptyFile(fileName, 'text/markdown'),
  
  /**
   * 创建空API文档
   */
  api: (fileName: string = 'API.md') => createEmptyFile(fileName, 'text/markdown'),
  
  /**
   * 创建空测试文件
   */
  test: (fileName: string = '新建文件.test.js') => createEmptyFile(fileName, 'application/javascript'),
  
  /**
   * 创建空样式文件
   */
  style: (fileName: string = '新建文件.scss') => createEmptyFile(fileName, 'text/x-scss'),
  
  /**
   * 创建空TypeScript声明文件
   */
  types: (fileName: string = '新建文件.d.ts') => createEmptyFile(fileName, 'application/typescript'),
  
  /**
   * 创建空环境变量文件
   */
  env: (fileName: string = '.env') => createEmptyFile(fileName, 'text/plain'),
  
  /**
   * 创建空包管理文件
   */
  package: (fileName: string = 'package.json') => createEmptyFile(fileName, 'application/json'),
  
  /**
   * 创建空依赖锁定文件
   */
  lock: (fileName: string = 'package-lock.json') => createEmptyFile(fileName, 'application/json'),
  
  /**
   * 创建空工作流文件
   */
  workflow: (fileName: string = '.github/workflows/main.yml') => createEmptyFile(fileName, 'application/x-yaml'),
};

/**
 * 验证文件类型
 * @param file File对象
 * @param allowedTypes 允许的文件类型数组
 * @returns 是否允许
 */
export function validateFileType(file: File, allowedTypes: string[]): boolean {
  const fileExtension = file.name.split('.').pop()?.toLowerCase();
  return allowedTypes.includes(fileExtension || '');
}

/**
 * 获取文件大小格式化字符串
 * @param bytes 字节数
 * @returns 格式化后的文件大小
 */
export function formatFileSize(bytes: number): string {
  if (bytes === 0) return '0 B';
  const k = 1024;
  const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
  const i = Math.floor(Math.log(bytes) / Math.log(k));
  return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
}

/**
 * 获取文件扩展名
 * @param fileName 文件名
 * @returns 文件扩展名（不包含点）
 */
export function getFileExtension(fileName: string): string {
  return fileName.split('.').pop()?.toLowerCase() || '';
}

/**
 * 检查是否为文本文件
 * @param fileName 文件名
 * @returns 是否为文本文件
 */
export function isTextFile(fileName: string): boolean {
  const textExtensions = [
    'txt', 'md', 'html', 'htm', 'css', 'scss', 'sass', 'less',
    'js', 'ts', 'vue', 'json', 'xml', 'log', 'csv', 'sql', 
    'php', 'py', 'java', 'c', 'cpp', 'h', 'hpp', 'cs', 'go', 
    'rs', 'swift', 'kt', 'scala', 'rb', 'pl', 'sh', 'bat', 
    'ps1', 'yaml', 'yml', 'toml', 'ini', 'conf', 'env', 
    'gitignore', 'dockerfile', 'license', 'readme', 'changelog',
    'api', 'test', 'd.ts', 'scss', 'sass', 'less'
  ];
  return textExtensions.includes(getFileExtension(fileName));
}

/**
 * 检查是否为图片文件
 * @param fileName 文件名
 * @returns 是否为图片文件
 */
export function isImageFile(fileName: string): boolean {
  const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg', 'ico'];
  return imageExtensions.includes(getFileExtension(fileName));
}

/**
 * 检查是否为视频文件
 * @param fileName 文件名
 * @returns 是否为视频文件
 */
export function isVideoFile(fileName: string): boolean {
  const videoExtensions = ['mp4', 'avi', 'mov', 'wmv', 'flv', 'webm', 'mkv', 'm4v'];
  return videoExtensions.includes(getFileExtension(fileName));
}

/**
 * 检查是否为音频文件
 * @param fileName 文件名
 * @returns 是否为音频文件
 */
export function isAudioFile(fileName: string): boolean {
  const audioExtensions = ['mp3', 'wav', 'flac', 'aac', 'ogg', 'wma', 'm4a'];
  return audioExtensions.includes(getFileExtension(fileName));
}

/**
 * 检查是否为文档文件
 * @param fileName 文件名
 * @returns 是否为文档文件
 */
export function isDocumentFile(fileName: string): boolean {
  const documentExtensions = [
    'pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 
    'txt', 'rtf', 'md', 'html', 'htm', 'xml', 'json'
  ];
  return documentExtensions.includes(getFileExtension(fileName));
}

/**
 * 生成唯一文件名
 * @param originalName 原始文件名
 * @returns 唯一文件名
 */
export function generateUniqueFileName(originalName: string): string {
  const timestamp = Date.now();
  const random = Math.random().toString(36).substring(2, 8);
  const extension = getFileExtension(originalName);
  const nameWithoutExt = originalName.replace(`.${extension}`, '');
  
  return `${nameWithoutExt}_${timestamp}_${random}.${extension}`;
}
